$(document).ready(function () {
    getDBList();
    $("#query").keypress(function (e) {
        if (e.which == 13) {
            queryFunction();
        }
    });
    //update currently selected database
    $(document).on("click", "#db-list .list-group-item", function () {
        $("#db-list .list-group-item").each(function () {
            $(this).removeClass('selected');
        });
        $(this).addClass('selected');
    });

    //update currently table database
    $(document).on("click", "#table-list .list-group-item", function () {
        $("#table-list .list-group-item").each(function () {
            $(this).removeClass('selected');
        });
        $(this).addClass('selected');
    });


});

var isDatabaseSelected = true;

function getData(tableName) {
    if(!tableName){
        tableName = window.localStorage.getItem('tableName');
    }

    $.ajax({

        url: "getAllDataFromTheTable?tableName=" + tableName, success: function (result) {
            window.localStorage.setItem('tableName', tableName);
            result = JSON.parse(result);
            inflateData(result);

        }
    });

}

function queryFunction() {

    var query = $('#query').val();

    $.ajax({
        url: "query?query=" + escape(query), success: function (result) {

            result = JSON.parse(result);
            inflateData(result);

        }
    });

}

function downloadDb() {
    if (isDatabaseSelected) {
        $.ajax({
            url: "downloadDb", success: function () {
                window.location = 'downloadDb';
            }
        });
    }
}

function deleteDb() {
    if (isDatabaseSelected) {
        $.ajax({
            url: "deleteDb", success: function (result) {
                result = JSON.parse(result);
                if (result.isSuccessful) {
                    console.log("Database deleted successfully");
                    showSuccessInfo("Database Deleted Successfully");
                    getDBList();
                } else {
                    console.log("Database delete failed");
                    showErrorInfo("Database Delete Failed");
                }
            }
        });
    }
}

function getDBList() {

    $.ajax({
        url: "getDbList", success: function (result) {

            result = JSON.parse(result);
            var dbList = result.rows;
            $('#db-list').empty();
            var isSelectionDone = false;
            for (var count = 0; count < dbList.length; count++) {
                var dbName = dbList[count][0];
                var isEncrypted = dbList[count][1];
                var isDownloadable = dbList[count][2];
                var dbAttribute =
                    isEncrypted == "true" ? ' <span class="glyphicon glyphicon-lock" aria-hidden="true" style="color:blue"></span>' : "";
                if (dbName.indexOf("journal") == -1 && dbName.indexOf("-wal") == -1 && dbName.indexOf("-shm") == -1) {
                    $("#db-list")
                        .append("<a href='#' id=" + dbName + " class='list-group-item' onClick='openDatabaseAndGetTableList(\"" + dbName + "\", \"" +
                            isDownloadable + "\");'>" + dbName + dbAttribute + "</a>");
                    if (!isSelectionDone) {
                        isSelectionDone = true;
                        $('#db-list').find('a').trigger('click');
                    }
                }
            }

        }
    });

}

var lastTableName = getHashValue('table');

function openDatabaseAndGetTableList(db, isDownloadable) {

    // if("APP_SHARED_PREFERENCES" == db) {
    if (["ALL_PREFERENCES", "ALL_KV_STORE", "ALL_AppStorage"].includes(db)) {
        $('#run-query').removeClass('active');
        $('#run-query').addClass('disabled');
        $('#selected-db-download').removeClass('active');
        $('#selected-db-delete').removeClass('active');
        $('#selected-db-download').addClass('disabled');
        $('#selected-db-delete').addClass('disabled');
        isDatabaseSelected = false;
        $("#selected-db-info").text("SharedPreferences");
    } else {
        $('#run-query').removeClass('disabled');
        $('#run-query').addClass('active');
        $("#selected-db-info").text("Selected Database : " + db);
        if ("true" == isDownloadable) {
            $('#selected-db-download').addClass('active');
            $('#selected-db-delete').addClass('active');
            $('#selected-db-download').removeClass('disabled');
            $('#selected-db-delete').removeClass('disabled');
        } else {
            $('#selected-db-download').removeClass('active');
            $('#selected-db-delete').removeClass('active');
            $('#selected-db-download').addClass('disabled');
            $('#selected-db-delete').addClass('disabled');
        }
        isDatabaseSelected = true;
    }


    $.ajax({
        url: "getTableList?database=" + db, success: function (result) {

            result = JSON.parse(result);
            var tableList = result.rows;
            var dbVersion = result.dbVersion;
            if ("APP_SHARED_PREFERENCES" != db) {
                $("#selected-db-info").text("Selected Database : " + db + " Version : " + dbVersion);
            }
            $('#table-list').empty()
            for (var count = 0; count < tableList.length; count++) {
                var tableName = tableList[count];
                $("#table-list").append("<a href='#table=" + tableName + "' data-db-name='" + db + "' data-table-name='" + tableName
                    + "' class='list-group-item' onClick='getData(\"" + tableName + "\");'>" + tableName + "</a>");
            }

            if (lastTableName !== null) {
                $('a[data-table-name=' + lastTableName + ']').trigger('click');
            }
        }
    });

}

function inflateData(result) {

    if (result.isSuccessful) {

        if (!result.isSelectQuery) {
            showSuccessInfo("Query Executed Successfully");
            return;
        }

        var columnHeader = result.tableInfos;

        // set function to return cell data for different usages like set, display, filter, search etc..
        for (var i = 0; i < columnHeader.length; i++) {
            columnHeader[i]['targets'] = i;
            columnHeader[i]['data'] = function (row, type, val, meta) {
                var dataType = row[meta.col].dataType;
                if (type == "sort" && dataType == "boolean") {
                    return row[meta.col].value ? 1 : 0;
                }
                return row[meta.col].value;
            }
        }
        var columnData = result.rows;
        var tableId = "#db-data";
        if ($.fn.DataTable.isDataTable(tableId)) {
            $(tableId).DataTable().destroy();
        }

        $("#db-data-div").remove();
        $("#parent-data-div")
            .append('<div id="db-data-div"><table class="display nowrap" cellpadding="0" border="0" cellspacing="0" width="100%" class="table table-striped table-bordered display" id="db-data"></table></div>');

        var availableButtons;
        if (result.isEditable) {
            availableButtons = [
                {
                    text: 'Add',
                    name: 'add' // don not change name
                },
                {
                    extend: 'selected', // Bind to Selected row
                    text: 'Edit',
                    name: 'edit'        // do not change name
                },
                {
                    extend: 'selected',
                    text: 'Delete',
                    name: 'delete'
                }
            ];
        } else {
            availableButtons = [];
        }

        $(tableId).dataTable({
            "data": columnData,
            "columnDefs": columnHeader,
            'bPaginate': true,
            'searching': true,
            'bFilter': true,
            'bInfo': true,
            "bSort": true,
            "scrollX": true,
            "iDisplayLength": 10,
            "dom": "Bfrtip",
            select: 'single',
            altEditor: true, // Enable altEditor
            buttons: availableButtons
        })

        //attach row-updated listener
        $(tableId).on('update-row.dt', function (e, updatedRowData, callback) {
            var updatedRowDataArray = JSON.parse(updatedRowData);
            //add value for each column
            var data = columnHeader;
            for (var i = 0; i < data.length; i++) {
                data[i].value = updatedRowDataArray[i].value;
                data[i].dataType = updatedRowDataArray[i].dataType;
            }
            //send update table data request to server
            updateTableData(data, callback);
        });


        //attach delete-updated listener
        $(tableId).on('delete-row.dt', function (e, updatedRowData, callback) {
            var deleteRowDataArray = JSON.parse(updatedRowData);

            console.log(deleteRowDataArray);

            //add value for each column
            var data = columnHeader;
            for (var i = 0; i < data.length; i++) {
                data[i].value = deleteRowDataArray[i].value;
                data[i].dataType = deleteRowDataArray[i].dataType;

            }

            //send delete table data request to server
            deleteTableData(data, callback);
        });


        $(tableId).on('add-row.dt', function (e, updatedRowData, callback) {
            var deleteRowDataArray = JSON.parse(updatedRowData);

            console.log(deleteRowDataArray);

            //add value for each column
            var data = columnHeader;
            for (var i = 0; i < data.length; i++) {
                data[i].value = deleteRowDataArray[i].value;
                data[i].dataType = deleteRowDataArray[i].dataType;
            }

            //send delete table data request to server
            addTableData(data, callback);
        });

        // hack to fix alignment issue when scrollX is enabled
        $(".dataTables_scrollHeadInner").css({ "width": "100%" });
        $(".table ").css({ "width": "100%" });
    } else {
        if (!result.isSelectQuery) {
            showErrorInfo("Query Execution Failed");
        } else {
            showErrorInfo("Some Error Occurred");
        }
    }

}

//send update database request to server
function updateTableData(updatedData, callback) {
    //get currently selected element
    var selectedTableElement = $("#table-list .list-group-item.selected");

    var filteredUpdatedData = updatedData.map(function (columnData) {
        return {
            title: columnData.title,
            isPrimary: columnData.isPrimary,
            value: columnData.value,
            dataType: columnData.dataType
        }
    });
    //build request parameters
    var requestParameters = {};
    requestParameters.dbName = selectedTableElement.attr('data-db-name');
    requestParameters.tableName = selectedTableElement.attr('data-table-name');
    ;
    requestParameters.updatedData = encodeURIComponent(JSON.stringify(filteredUpdatedData));

    //execute request
    $.ajax({
        url: "updateTableData",
        type: 'GET',
        data: requestParameters,
        success: function (response) {
            response = JSON.parse(response);
            if (response.isSuccessful) {
                console.log("Data updated successfully");
                callback(true);
                showSuccessInfo("Data Updated Successfully");
            } else {
                console.log("Data updated failed");
                callback(false);
            }
        }
    })
}


function deleteTableData(deleteData, callback) {

    var selectedTableElement = $("#table-list .list-group-item.selected");
    var filteredUpdatedData = deleteData.map(function (columnData) {
        return {
            title: columnData.title,
            isPrimary: columnData.isPrimary,
            value: columnData.value,
            dataType: columnData.dataType
        }
    });

    //build request parameters
    var requestParameters = {};
    requestParameters.dbName = selectedTableElement.attr('data-db-name');
    requestParameters.tableName = selectedTableElement.attr('data-table-name');
    ;
    requestParameters.deleteData = encodeURIComponent(JSON.stringify(filteredUpdatedData));

    //execute request
    $.ajax({
        url: "deleteTableData",
        type: 'GET',
        data: requestParameters,
        success: function (response) {
            response = JSON.parse(response);
            if (response.isSuccessful) {
                console.log("Data deleted successfully");
                callback(true);
                showSuccessInfo("Data Deleted Successfully");
            } else {
                console.log("Data delete failed");
                callback(false);
            }
        }
    })
}

function addTableData(deleteData, callback) {

    var selectedTableElement = $("#table-list .list-group-item.selected");
    var filteredUpdatedData = deleteData.map(function (columnData) {
        return {
            title: columnData.title,
            isPrimary: columnData.isPrimary,
            value: columnData.value,
            dataType: columnData.dataType
        }
    });

    console.log(filteredUpdatedData);

    //build request parameters
    var requestParameters = {};
    requestParameters.dbName = selectedTableElement.attr('data-db-name');
    requestParameters.tableName = selectedTableElement.attr('data-table-name');
    ;
    requestParameters.addData = encodeURIComponent(JSON.stringify(filteredUpdatedData));

    console.log(requestParameters);

    //execute request
    $.ajax({
        url: "addTableData",
        type: 'GET',
        data: requestParameters,
        success: function (response) {
            response = JSON.parse(response);
            if (response.isSuccessful) {
                console.log("Data Added successfully");
                callback(true);
                getData(requestParameters.tableName);
                showSuccessInfo("Data Added Successfully");
            } else {
                console.log("Data Adding failed");
                callback(false);
            }
        }
    });
}

function showSuccessInfo(message) {
    var snackbarId = "snackbar";
    var snackbarElement = $("#" + snackbarId);
    snackbarElement.addClass("show");
    snackbarElement.css({ "backgroundColor": "#5cb85c" });
    snackbarElement.html(message)
    setTimeout(function () {
        snackbarElement.removeClass("show");
    }, 3000);
}

function showErrorInfo(message) {
    var snackbarId = "snackbar";
    var snackbarElement = $("#" + snackbarId);
    snackbarElement.addClass("show");
    snackbarElement.css({ "backgroundColor": "#d9534f" });
    snackbarElement.html(message)
    setTimeout(function () {
        snackbarElement.removeClass("show");
    }, 3000);
}

function getHashValue(key) {
    var matches = location.hash.match(new RegExp(key + '=([^&]*)'));
    return matches ? matches[1] : null;
}
